home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / comm / uucp / AM114src.lha / am.c < prev    next >
C/C++ Source or Header  |  1992-07-08  |  44KB  |  1,711 lines

  1. /*
  2.  *
  3.  *  AM --- AmigaMail
  4.  *  (C) 1991, 1992 by Christian Riede
  5.  *
  6.  *  AM is distributed in the hope that it will be useful, but WITHOUT ANY
  7.  *  WARRANTY.  No author or distributor accepts responsibility to anyone
  8.  *  for the consequences of using it or for whether it serves any
  9.  *  particular purpose or works at all, unless he says so in writing.
  10.  *  Refer to the GNU General Public License, Version 1, for full details.
  11.  *  
  12.  *  Everyone is granted permission to copy, modify and redistribute AM,
  13.  *  but only under the conditions described in the GNU General Public
  14.  *  License, Version 1.  A copy of this license is supposed to have been 
  15.  *  given to you along with AM so you can know your rights and responsi-
  16.  *  bilities.  It should be in a file named COPYING.  Among other things,
  17.  *  the copyright notice and this notice must be preserved on all copies.
  18.  *
  19.  *  
  20.  *
  21.  */
  22.  
  23. #include "am.h"
  24.  
  25. UBYTE *vers = (UBYTE *)("\0$VER: AM "AMIGAMAIL_VERSION);
  26.  
  27. /* stolen from TERM by Olaf "Olsen" Barthel */
  28. static USHORT StopwatchProto[(2 + 16) * 2] =
  29. {
  30.     0x0000,0x0000,
  31.  
  32.     0x0400,0x07C0,
  33.     0x0000,0x07C0,
  34.     0x0100,0x0380,
  35.     0x0000,0x07E0,
  36.     0x07C0,0x1FF8,
  37.     0x1FF0,0x3FEC,
  38.     0x3FF8,0x7FDE,
  39.     0x3FF8,0x7FBE,
  40.     0x7FFC,0xFF7F,
  41.     0x7EFC,0xFFFF,
  42.     0x7FFC,0xFFFF,
  43.     0x3FF8,0x7FFE,
  44.     0x3FF8,0x7FFE,
  45.     0x1FF0,0x3FFC,
  46.     0x07C0,0x1FF8,
  47.     0x0000,0x07E0,
  48.  
  49.     0x0000,0x0000
  50. };
  51.  
  52. static USHORT *Stopwatch;
  53.  
  54. #ifdef AZTEC_C 
  55. extern struct WBStartup *WBenchMsg;
  56. #endif
  57.  
  58. struct TextAttr TextAttr;
  59. struct TextFont *TextFont;
  60.  
  61. /* poer where notification messages arrive */
  62. struct MsgPort *NotifyPort;
  63.  
  64. char Username[MAIL_FIELDLENGTH];
  65. char Realname[MAIL_FIELDLENGTH];
  66.  
  67. /* title of window */
  68. static char Windowtitle[160];
  69.  
  70. /* title of the listview gadget */
  71. static char Mailboxtitle[160];
  72.  
  73. /* contents is locked? */
  74. int ContentsLocked = FALSE;
  75.  
  76. /* number of running subprocesses (->send.c) */
  77. int running = 0;
  78.  
  79. /* the menues */
  80.  
  81. #define PROJ_ABOUT        1
  82. #define PROJ_EXIT         2
  83. #define PROJ_QUIT         3
  84.  
  85. #define AC_READ          4
  86. #define AC_SAVE          5
  87. #define AC_SEND          6
  88. #define AC_SENDILBM      7
  89. #define AC_SENDGIF       8
  90. #define AC_REPLY         9
  91. #define AC_REPLY_QUOTE   10
  92. #define AC_REPLY_QUOTE_H 11
  93. #define AC_FORWARD       12
  94. #define AC_FORWARD_H     13
  95. #define AC_MARK_READ     14
  96. #define AC_MARK_UNREAD   15
  97. #define AC_SEARCH_TEXT   16
  98. #define AC_PRINT         17
  99. #define AC_DELETE        18
  100.  
  101. #define ADDR_EDIT         19
  102. #define ADDR_PRINT        20
  103. #define ADDR_ADDCURR      21
  104.  
  105. #define CONF_FONT         22
  106. #define CONF_COLORS       23
  107. #define CONF_RRT          24
  108. #define CONF_SCREEN       26
  109. #define CONF_MEDITOR      27
  110. #define CONF_RFILTER      28
  111. #define CONF_ILBMFILTER   29
  112. #define CONF_SIGNATURE    30
  113. #define CONF_REPLY_TO     31
  114. #define CONF_SAVE         32
  115. #define CONF_LOAD         33
  116.  
  117. #define SCR_PUBSCR        34
  118.  
  119. /* using APTR UserData as ULONG-Constant. Requires some silly casting */
  120. static struct NewMenu NewMenu[] = {
  121. {NM_TITLE,(STRPTR)"Project",0,0,0,0},
  122.     {NM_ITEM,(STRPTR)"About",0,0,0,(APTR)PROJ_ABOUT},
  123.     {NM_ITEM,(STRPTR)"Exit",(STRPTR)"x",0,0,(APTR)PROJ_EXIT},
  124.     {NM_ITEM,(STRPTR)"Quit",(STRPTR)"q",0,0,(APTR)PROJ_QUIT},
  125. {NM_TITLE,(STRPTR)"Action",0,0,0,0},
  126.     {NM_ITEM,(STRPTR)"Read",0,0,0,(APTR)AC_READ},
  127.     {NM_ITEM,(STRPTR)"Save to File",0,0,0,(APTR)AC_SAVE},
  128.     {NM_ITEM,(STRPTR)"Send",(STRPTR)"s",0,0,(APTR)AC_SEND},
  129.     {NM_ITEM,(STRPTR)"Send ILBM",0,0,0,(APTR)AC_SENDILBM},
  130.     {NM_ITEM,(STRPTR)"Send GIF",0,0,0,(APTR)AC_SENDGIF},
  131.     {NM_ITEM,(STRPTR)"Reply",0,0,0,(APTR)AC_REPLY},
  132.     {NM_ITEM,(STRPTR)"Reply (quote)",(STRPTR)"r",0,0,(APTR)AC_REPLY_QUOTE},
  133.     {NM_ITEM,(STRPTR)"Reply (quote+H)",0,0,0,(APTR)AC_REPLY_QUOTE_H},
  134.     {NM_ITEM,(STRPTR)"Forward",(STRPTR)"f",0,0,(APTR)AC_FORWARD},
  135.     {NM_ITEM,(STRPTR)"Forward (H)",0,0,0,(APTR)AC_FORWARD_H},
  136.     {NM_ITEM,(STRPTR)"Print",(STRPTR)"p",0,0,(APTR)AC_PRINT},
  137.     {NM_ITEM,(STRPTR)"Mark as Read",0,0,0,(APTR)AC_MARK_READ},
  138.     {NM_ITEM,(STRPTR)"Mark as Unread",0,0,0,(APTR)AC_MARK_UNREAD},
  139.     {NM_ITEM,(STRPTR)"Search Text",0,0,0,(APTR)AC_SEARCH_TEXT},
  140.     {NM_ITEM,(STRPTR)"Delete",(STRPTR)"d",0,0,(APTR)AC_DELETE},
  141. {NM_TITLE,(STRPTR)"Addressbook",0,0,0,0},
  142.     {NM_ITEM,(STRPTR)"Edit...",0,0,0,(APTR)ADDR_EDIT},
  143. /*    {NM_ITEM,(STRPTR)"Print...",0,0,0,(APTR)ADDR_PRINT},*/
  144.     {NM_ITEM,(STRPTR)"Add current from-address",0,0,0,(APTR)ADDR_ADDCURR},
  145. {NM_TITLE,(STRPTR)"Config",0,0,0,0},
  146.     {NM_ITEM,(STRPTR)"Return-Receipt-To",0,CHECKIT,0,(APTR)CONF_RRT},
  147.     {NM_ITEM,(STRPTR)"Font...",0,0,0,(APTR)CONF_FONT},
  148.     {NM_ITEM,(STRPTR)"Colors...",0,0,0,(APTR)CONF_COLORS},
  149.     {NM_ITEM,(STRPTR)"Screen",0,0,0,(APTR)CONF_SCREEN},
  150.         {NM_SUB,(STRPTR)"PAL HIRES",0,CHECKIT,~1,(APTR)(PAL_MONITOR_ID|HIRES_KEY)},
  151.         {NM_SUB,(STRPTR)"PAL HIRES LACE",0,CHECKIT,~2,(APTR)(PAL_MONITOR_ID|HIRESLACE_KEY)},
  152.         {NM_SUB,(STRPTR)"NTSC HIRES",0,CHECKIT,~4,(APTR)(NTSC_MONITOR_ID|HIRES_KEY)},
  153.         {NM_SUB,(STRPTR)"NTSC HIRES LACE",0,CHECKIT,~8,(APTR)(NTSC_MONITOR_ID|HIRESLACE_KEY)},
  154.         {NM_SUB,(STRPTR)"PRODUCTIVITY",0,CHECKIT,~16,(APTR)(VGAPRODUCT_KEY)},
  155.         {NM_SUB,(STRPTR)"PRODUCTIVITY LACE",0,CHECKIT,~32,(APTR)(VGAPRODUCTLACE_KEY)},
  156.         {NM_SUB,(STRPTR)"Public Screen",0,CHECKIT,~64,(APTR)SCR_PUBSCR},
  157.     {NM_ITEM,(STRPTR)"Mail Editor",0,0,0,(APTR)CONF_MEDITOR},
  158.     {NM_ITEM,(STRPTR)"Text Viewer",0,0,0,(APTR)CONF_RFILTER},
  159.     {NM_ITEM,(STRPTR)"Signature File",0,0,0,(APTR)CONF_SIGNATURE},
  160.     {NM_ITEM,(STRPTR)"Reply-To Address",0,0,0,(APTR)CONF_REPLY_TO},
  161.     {NM_ITEM,(STRPTR)"Load Config...",0,0,0,(APTR)CONF_LOAD},
  162.     {NM_ITEM,(STRPTR)"Save Config...",0,0,0,(APTR)CONF_SAVE},
  163. {NM_END,0,0,0,0,0}
  164. };
  165.  
  166. /* the gadgets (dimensions adjusted later) */
  167.  
  168. static struct NewGadget ListGadget = 
  169. {
  170.     0,0,0,0,
  171.     (UBYTE *)Mailboxtitle,&TextAttr,
  172.     LIST,
  173.     PLACETEXT_ABOVE,
  174.     0,    
  175.     0
  176. };
  177.  
  178. static char *SelectLabels[] = {
  179. "Select New","Select All","Select Last Week","Select From Me","Select To Me","Select Matching",0
  180. };
  181.  
  182. static struct NewGadget SelectGadget =
  183. {
  184.     0,0,0,0,
  185.     (UBYTE *)"Select",&TextAttr,
  186.     SELECT,
  187.     PLACETEXT_RIGHT,
  188.     0,    
  189.     0
  190. };
  191.  
  192. static char *ShowLabels[] = {
  193. "Show All","Show From","Show To","Show Subject","Show Date","Show MsgId",0
  194. };
  195.  
  196. static struct NewGadget ShowGadget =
  197. {
  198.     0,0,0,0,
  199.     (UBYTE *)"Select",&TextAttr,
  200.     SHOW,
  201.     PLACETEXT_RIGHT,
  202.     0,    
  203.     0
  204. };
  205.  
  206. static char *SortLabels[] = {
  207. "Sort Number","Sort From","Sort To","Sort Subject","Sort Date","Sort Thread",0
  208. };
  209.  
  210. static struct NewGadget SortGadget =
  211. {
  212.     0,0,0,0,
  213.     (UBYTE *)"Select",&TextAttr,
  214.     SORT,
  215.     PLACETEXT_RIGHT,
  216.     0,    
  217.     0
  218. };
  219.  
  220. /* the mailbox list */
  221. struct List Mailbox;
  222.  
  223. /* the list of displayed items */
  224. struct List Selected;
  225.  
  226. /* the screen we are using */
  227. struct Screen *Screen,*PubScreen;
  228.  
  229. /* our window */
  230. struct Window *Window;
  231.  
  232. /* to save MyProcess->pr_WindowPtr */
  233. static struct Window *OldProcessWindow;
  234.  
  235. /* the libraries */
  236. struct IntuitionBase *IntuitionBase;
  237. struct GfxBase *GfxBase;
  238. struct Library *GadToolsBase;
  239. struct Library *IconBase;
  240. struct Library *AslBase;
  241. struct Library *DiskfontBase;
  242. /*struct SregExpBase *SregExpBase;*/
  243.  
  244. /* some pointers to gadgets */
  245. static struct Gadget *GList,*gad,*LVGadget,*SelGad;
  246.  
  247. /* the menu */
  248. static struct Menu *Menu;
  249.  
  250. /* myself */
  251. static struct Process *MyProcess;
  252.  
  253. /* File-/fontrequester */
  254. struct FileRequester *FReq;
  255. struct FontRequester *FontReq;
  256.  
  257. /* functions currently used to display the mailbox */
  258. void (*Show)(struct List *) = ShowAll;
  259. void (*Select)(struct List *,struct List *,
  260.     void (*Sort)(struct List *,struct Mail *),void *) = SelectNew;
  261. void (*Sort)(struct List *,struct Mail *) = InsertByNumber;
  262.  
  263. char SearchPattern[MAIL_FIELDLENGTH];
  264.  
  265. /* the last selected item */
  266. int LastSelected = -1;
  267.  
  268. static UWORD pens = ~0;
  269.  
  270. static char Config[160];
  271.  
  272. /* Our windows dimensions */
  273. static int WLeft,WTop,WWidth,WHeight;
  274.  
  275. static struct RDArgs RDArgs = {
  276. {0,0,0}, /* CSource */
  277. 0,0,0,0,0};
  278.  
  279. static struct RDArgs *ParsedArgs;
  280.  
  281. static LONG CommandLine[3];
  282.  
  283. /* show busy pointer, turn IDCMP off */
  284. void Busy(void)
  285. {
  286.     SetWindowTitles(Window,(UBYTE *)Windowtitle,(UBYTE *)"AmigaMail (Busy)");
  287.     ModifyIDCMP(Window,0L);
  288.     SetPointer(Window,&Stopwatch[0],16,16,-6,0);
  289. }
  290.  
  291. /* show normal pointer, turn IDCMP on */
  292. void Ready(void)
  293. {
  294.     SetWindowTitles(Window,(UBYTE *)Windowtitle,(UBYTE *)"AmigaMail");
  295.  
  296. ModifyIDCMP(Window,SIZEVERIFY|NEWSIZE|MENUPICK|CLOSEWINDOW|LISTVIEWIDCMP|MXIDCMP|VANILLAKEY|RAWKEY);
  297.     ClearPointer(Window);
  298. }
  299.  
  300. /* show panic-requester, cleanup, exit with given returncode */
  301. void Panic(int ret,char *message)
  302. {
  303.     struct Message *Msg;
  304.  
  305.     /* TODO: free contents list */
  306.  
  307.     /* show message */
  308.     if (message)
  309.         if (*message)
  310.             if (IntuitionBase) SimpleRequest(Window,message);
  311.             else puts(message);
  312.  
  313.     /* restore MyProcess->pr_WindowPtr */
  314.     if (OldProcessWindow) MyProcess->pr_WindowPtr = OldProcessWindow;
  315.  
  316.     /* remove menus */
  317.     if (Menu) {ClearMenuStrip(Window); FreeMenus(Menu); Menu=0;}
  318.  
  319.     /* remove,free gadgets */
  320.     if (GList) {RemoveGList(Window,GList,-1); FreeGadgets(GList); GList = 0;}
  321.  
  322.     /* close window */
  323.     if (Window) {CloseWindow(Window); Window = 0;}
  324.  
  325.     /* free visual info */
  326.     if (ListGadget.ng_VisualInfo) 
  327.         FreeVisualInfo(ListGadget.ng_VisualInfo);
  328.  
  329.     /* close screen */
  330.     if (Screen) {CloseScreen(Screen); Screen = 0;}
  331.     if (PubScreen) {UnlockPubScreen(0,PubScreen); PubScreen = 0;}
  332.  
  333.     if (TextFont) {CloseFont(TextFont); TextFont = 0;}
  334.  
  335.     if (ret >= 0)
  336.     {
  337.         if (ParsedArgs) {FreeArgs(ParsedArgs); ParsedArgs = 0;}
  338.  
  339.         /* disable notification */
  340.         if (NotifyPort) 
  341.         {
  342.             if (ServerPort)
  343.                 NotifyOff(NotifyPort);
  344.                 
  345.             while (Msg = GetMsg(NotifyPort));
  346.         }
  347.  
  348.         if (ContentsLocked) {UnLockContents();ContentsLocked = FALSE;};
  349.  
  350.         if (NotifyPort) DeletePort(NotifyPort);
  351.  
  352.         if (FReq) {FreeFileRequest(FReq); FReq = 0;}
  353.  
  354.         if (FontReq) {FreeAslRequest(FontReq); FontReq = 0;}
  355.  
  356.         if (Stopwatch) FreeMem(Stopwatch,sizeof(StopwatchProto));
  357.  
  358.         /* close libraries */
  359.         if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  360.         if (GfxBase) CloseLibrary((struct Library *)IntuitionBase);
  361.         if (GadToolsBase) CloseLibrary(GadToolsBase);
  362.         if (DiskfontBase) CloseLibrary((struct Library *)DiskfontBase);
  363.         if (IconBase) CloseLibrary(IconBase);
  364.         if (AslBase) CloseLibrary(AslBase);
  365. /*        if (SregExpBase) CloseLibrary((struct Library *)SregExpBase);*/
  366.  
  367.         /* that's it */
  368.         exit(ret);
  369.  
  370.     }
  371. }
  372.  
  373. #ifdef __GNUC__
  374. /* called when caught a signal */
  375. void SigPanic(int Signal)
  376. {
  377.     Panic(100,"Caught Signal");
  378. }
  379. #endif
  380.  
  381. /* refresh display */
  382. /* if Select!=0 build new display list */
  383. /* if show!=0 generate new strings to display */
  384. void RefreshDisplay(void (*Select)(struct List *,struct List *,
  385.     void (*)(struct List *,struct Mail *),void *),
  386.     void (*Show)(struct List *),void (*Sort)(struct List *,struct Mail *),
  387.     struct List *Mailbox, struct List *Selected,int select,void *extra)
  388. {
  389.  
  390.     /* remove list from gadget */
  391.     GT_SetGadgetAttrs(LVGadget,Window,0,
  392.         GTLV_Labels,0L,
  393.         TAG_END);
  394.  
  395.     /* do the new showing/selection */
  396.     if (Show) (*Show)(Mailbox);
  397.     if (Select && Sort) 
  398.     {
  399.         DeselectAll(Selected);
  400.         (*Select)(Mailbox,Selected,Sort,extra);
  401.     }        
  402.  
  403.     /* put list into gadget */
  404.     if (select!=-1)
  405.         GT_SetGadgetAttrs(LVGadget,Window,0,
  406.             GTLV_Labels,Selected,
  407.             GTLV_Selected, select,
  408.             TAG_END);
  409.     else
  410.         GT_SetGadgetAttrs(LVGadget,Window,0,
  411.             GTLV_Labels,Selected,
  412.             TAG_END);
  413.  
  414.     /* refresh all */
  415.     RefreshGList(GList,Window,NULL,-1);
  416.  
  417. }
  418.  
  419. /* get Realname of given User */
  420. /* look up in GETTY:passwd */
  421. static int GetRealName(char *Realname,char *Username)
  422. {
  423.     FILE *passwd;
  424.     static char InputBuffer[MAIL_FIELDLENGTH];
  425.     static char Compare[20];
  426.  
  427.     if (!(passwd = fopen("GETTY:passwd","r")))
  428.         return(FALSE);
  429.  
  430.     while (fgets(InputBuffer,MAIL_FIELDLENGTH,passwd))
  431.     {
  432.         if (InputBuffer[0]=='#') continue;
  433.         if (InputBuffer[0]==' ') continue;
  434.         if (InputBuffer[0]=='\n') continue;
  435.  
  436.         if (sscanf(InputBuffer,"%[^,],%*[^,],%*d,%*d,%[^,],",Compare,Realname)==2)
  437.         {
  438.             if (!strcmp(Compare,Username))
  439.             {
  440.                 fclose(passwd);
  441.                 if (Realname[0]=='(' && Realname[strlen(Realname)-1]==')')
  442.                 {
  443.                     while (*(Realname+1)) 
  444.                     {
  445.                         *Realname = *(Realname+1);
  446.                         Realname++;
  447.                     }
  448.                     *(--Realname)=0;
  449.                 }
  450.                 return(TRUE); /* that's what we were looking for */
  451.             }
  452.         }
  453.     }
  454.  
  455.     fclose(passwd);
  456.  
  457.     return(FALSE);
  458. }
  459.  
  460. int main(int argc, char *argv[])
  461. {
  462.     struct Mail *New,*Mail;
  463.     int run;
  464.     struct IntuiMessage *IMsg;
  465.     struct AMMessage *Msg;
  466.     ULONG Class;
  467.     ULONG Code;
  468.     APTR IAddr;
  469.     struct DiskObject *dop=0;
  470.     struct MenuItem *MenuItem;
  471.     ULONG LastSecs=0,LastMicros=0;
  472.     ULONG Secs,Micros;
  473.     struct NewMenu *nm;
  474.     struct DimensionInfo di;
  475.     struct Rectangle *rect;
  476.     unsigned long vpmid;
  477.     char IFFName[160];
  478.     char SendParms[160];
  479.     int SearchHeader;
  480.     int ExitFlag=TRUE;
  481.     ULONG Signals;
  482.     char *s;
  483. #ifdef __GNUC__
  484.     struct WBStartup *WBenchMsg;
  485. #endif
  486.  
  487.  
  488. #ifdef __GNUC__
  489.     /* catch signals */
  490.     signal(SIGFPE,SigPanic);
  491.     signal(SIGILL,SigPanic);
  492.     signal(SIGABRT,SigPanic);
  493.     signal(SIGBUS,SigPanic);
  494.     signal(SIGSEGV,SigPanic);
  495. #endif
  496.  
  497.     /* print copyright notice */
  498.     if (argc) /* startet from CLI ? */
  499.     {
  500.         printf("AM %s - AmigaMail\n",AMIGAMAIL_VERSION);
  501.         puts("(C) 1991, 1992 by Christian Riede");
  502.         puts("Use and distribute under the terms of the");
  503.         puts("GNU General Public Licence, Version 1!");
  504.     }
  505.  
  506.     /* open libraries */
  507.     if (!(IntuitionBase = (struct IntuitionBase *)
  508.         OpenLibrary((UBYTE *)"intuition.library",AM_LIBRARY_VERSION)))
  509.         Panic(20,"Can't open intuition.library!");
  510.  
  511.     if (!(GfxBase = (struct GfxBase *)
  512.         OpenLibrary((UBYTE *)"graphics.library",AM_LIBRARY_VERSION)))
  513.         Panic(50,"Can't open graphics.library!");
  514.  
  515.     if (!(DiskfontBase = 
  516.         OpenLibrary((UBYTE *)"diskfont.library",AM_LIBRARY_VERSION)))
  517.         Panic(51,"Can't open diskfont.library!");
  518.  
  519.     if (!(GadToolsBase =
  520.         OpenLibrary((UBYTE *)"gadtools.library",AM_LIBRARY_VERSION)))
  521.         Panic(21,"can't open gadtools.library!");
  522.  
  523.     if (!(IconBase = 
  524.         OpenLibrary((UBYTE *)"icon.library",AM_LIBRARY_VERSION)))
  525.         Panic(40,"can't open icon.library!");
  526.  
  527.     if (!(AslBase = 
  528.         OpenLibrary((UBYTE *)"asl.library",AM_LIBRARY_VERSION)))
  529.         Panic(45,"can't open asl.library!");
  530.  
  531. /*    if (!(SregExpBase = (struct SregExpBase *)
  532.         OpenLibrary((UBYTE *)SREGEXPNAME,11L)))
  533.         Panic(48,"can't open sregexp.library!");
  534. */
  535.  
  536.     /* copy Stopwatch to ChipMem */
  537.     if (!(Stopwatch = AllocMem(sizeof(StopwatchProto),MEMF_CHIP)))
  538.         Panic(52,"No ChipMem");
  539.     CopyMem(StopwatchProto,Stopwatch,sizeof(StopwatchProto));
  540.  
  541.  
  542.     /* get user-/realname */
  543.     if (argc) /* started from CLI */
  544.     {
  545.         /* can check argv[1] only when it's sure */
  546.         /* that we have at least one argument  */
  547.         if (argc>1)
  548.             if (*argv[1]=='?')
  549.                 goto getfromstdin;
  550.  
  551.         RDArgs.RDA_Source.CS_Buffer = GetArgStr();
  552.         RDArgs.RDA_Source.CS_Length = (RDArgs.RDA_Source.CS_Buffer)?
  553.             (strlen((char *)RDArgs.RDA_Source.CS_Buffer)):(0);
  554.  
  555. getfromstdin:
  556.  
  557.         if (!(ParsedArgs = ReadArgs((UBYTE *)"USERNAME,CONFIGNAME",CommandLine,&RDArgs)))
  558.         {
  559.             puts("USAGE: am [USERNAME] [CONFIG]");
  560.             puts("(or setenv USERNAME)");
  561.             Panic(0,0);
  562.         }
  563.  
  564.         if (CommandLine[0]) 
  565.             strcpy(Username,(char *)CommandLine[0]);
  566.         else
  567.             if (!(getenv("USERNAME")))
  568.                 Panic(0,"Can't get USERNAME!");
  569.             else
  570.                 strcpy(Username,getenv("USERNAME"));
  571.  
  572.  
  573.         if (CommandLine[1]) 
  574.             strcpy(Config,(char *)CommandLine[1]);
  575.  
  576.         if (!GetRealName(Realname,Username))
  577.         {
  578.             printf("\nNo entry found for user %s\n",Username);
  579.             Panic(0,0);
  580.         }
  581.     }
  582.     else /* started from WB */
  583.     {
  584. #ifdef __GNUC__
  585.         WBenchMsg = (struct WBStartup *)argv;
  586. #endif
  587.  
  588.         if (!(dop = GetDiskObject((UBYTE *)WBenchMsg->sm_ArgList->wa_Name)))
  589.             Panic(41,"can't get diskobject!");
  590.  
  591.         /* try to get Username from ToolTypes */
  592.         s = (char *) FindToolType((UBYTE **)dop->do_ToolTypes ,(UBYTE *)"USERNAME");
  593.  
  594.         if (s) /* found? */
  595.         {
  596.             strcpy(Username,s);
  597.             if (!GetRealName(Realname,Username))
  598.                 Panic(53,"No entry found for user!");
  599.         }
  600.         else if (!(getenv("USERNAME")))
  601.             Panic(54,"Can't get USERNAME/REALNAME!");
  602.         else
  603.         {
  604.             strcpy(Username,getenv("USERNAME"));
  605.             if (!GetRealName(Realname,Username))
  606.                 Panic(55,"No entry found for user!");
  607.         }
  608.  
  609.         /* config file given? */
  610.         s = (char *) FindToolType((UBYTE **)dop->do_ToolTypes ,(UBYTE *)"CONFIG");
  611.  
  612.         if (s)
  613.             strcpy(Config,s);
  614.  
  615.         FreeDiskObject(dop);
  616.     }
  617.  
  618.     /* create NIL: filehandles for System() */
  619.     if (!(AMSystemTags[0].ti_Data = (ULONG)
  620.         Open((UBYTE *)"NIL:",MODE_OLDFILE)))
  621.         Panic(48,"Can't open NIL: for read!");
  622.     if (!(AMSystemTags[1].ti_Data = (ULONG)
  623.         Open((UBYTE *)"NIL:",MODE_NEWFILE)))
  624.         Panic(49,"Can't open NIL: for write!");
  625.  
  626.     /* find server */
  627.     if (!(ServerPort = FindPort(SERVERNAME)))
  628.         Panic(59,"server not running!");
  629.  
  630.     /* create notify port */
  631.     if (!(NotifyPort = CreatePort(0,0)))
  632.         Panic(60,"can't create notify port!");
  633.  
  634.     /* check version of server */
  635.     if (!CmpVersion())
  636.         Panic(61,"Wrong version of server!");
  637.  
  638.     /* read Config */
  639.     if (!*Config)
  640.         strcpy(Config,"UULIB:am.config");
  641.     ReadConfig(Config);
  642.  
  643.     if (!*NodeName) Panic(36,"No NodeName in UULIB:Config!");
  644.     if (!*DomainName) strcpy(DomainName,".UUCP");
  645.  
  646.     /* title of listview-gadget */
  647.     sprintf(Mailboxtitle,"Mailbox of %s@%s%s (%s)",
  648.         Username,NodeName,DomainName,Realname);
  649.  
  650.     /* init the mailbox-list */
  651.     Mailbox.lh_Head = (struct Node *)&Mailbox.lh_Tail;
  652.     Mailbox.lh_TailPred = (struct Node *)&Mailbox.lh_Head;
  653.     Mailbox.lh_Tail = 0;
  654.     Mailbox.lh_Type = AMNT_MAILBOX;
  655.  
  656.     /* init Selected-list */
  657.     Selected.lh_Head = (struct Node *)&Selected.lh_Tail;
  658.     Selected.lh_TailPred = (struct Node *)&Selected.lh_Head;
  659.     Selected.lh_Tail = 0;
  660.     Selected.lh_Type = AMNT_SELECT_LIST;
  661.  
  662.     /* lock contents */
  663.     if (!(ContentsLocked = LockContents()))
  664.         Panic(62,"Can't lock contents");
  665.  
  666.     /* read in the mailbox */
  667.     if (!GetContents(&Mailbox))
  668.         Panic(63,"Can't get contents");
  669.  
  670.     /* request notification */
  671.     if (!NotifyOn(NotifyPort))
  672.         Panic(64,"notification request denied!");
  673.  
  674.     /* allocate asl requesters */
  675.     if (!(FReq = (struct FileRequester *)
  676.         AllocAslRequestTags(ASL_FileRequest,
  677.             TAG_END,0)))
  678.     {
  679.         DeselectAll(&Selected);
  680.         Panic(44,"Can't get Filerequester!");
  681.     }
  682.  
  683.     if (!(FontReq = (struct FontRequester *)
  684.         AllocAslRequestTags(ASL_FontRequest,
  685.             ASL_FuncFlags,FONF_FIXEDWIDTH,
  686.             ASL_MinHeight,4,
  687.             ASL_MaxHeight,16,
  688.             TAG_END,0)))
  689.     {
  690.         DeselectAll(&Selected);
  691.         Panic(56,"Can't get FontRequester!");
  692.     }
  693.  
  694. restart: /* reentry when window must be opened again */
  695.  
  696.     /* uncheck all checkit-items */
  697.     for (nm=NewMenu;nm->nm_Type!=NM_END;++nm)
  698.         if (nm->nm_Flags & CHECKIT)
  699.             nm->nm_Flags &= ~CHECKED;
  700.  
  701.     /* check menuitem for screendata */
  702.     if (AMDisplayID)
  703.     {
  704.         for (nm=NewMenu;nm->nm_Type!=NM_END;++nm)
  705.             if (nm->nm_UserData == (APTR)AMDisplayID)
  706.             {
  707.                 nm->nm_Flags |= CHECKED;
  708.                 break;
  709.             }
  710.     }
  711.     else
  712.         for (nm=NewMenu;nm->nm_Type!=NM_END;++nm)
  713.             if (nm->nm_UserData == (APTR)SCR_PUBSCR)
  714.             {
  715.                 nm->nm_Flags |= CHECKED;
  716.                 break;
  717.             }
  718.  
  719.     /* check menuitem for return-receipt-to */
  720.     for (nm=NewMenu;nm->nm_Type!=NM_END;++nm)
  721.         if (nm->nm_UserData == (APTR)CONF_RRT)
  722.         {
  723.             if (AMReturnReceiptTo[0]=='y' || AMReturnReceiptTo[0]=='Y')
  724.                 nm->nm_Flags |= CHECKED;
  725.             else
  726.                 nm->nm_Flags &= ~CHECKED;
  727.             break;
  728.         }
  729.  
  730.     /* look for other AM's public screen */
  731.     if (PubScreen = LockPubScreen((UBYTE *)PUBSCREENNAME))
  732.         strcpy(AMPubScreen,PUBSCREENNAME);
  733.     else
  734.     {
  735.         /* open screen */
  736.         if (*AMPubScreen)
  737.         {
  738.             if (!(PubScreen = LockPubScreen((UBYTE *)AMPubScreen)))
  739.             {
  740.                 SimpleRequest(Window,"Can't Lock Public Screen");
  741.                 if (!(PubScreen = LockPubScreen(0)))
  742.                     Panic(48,"can't lock default public screen!");
  743.             }
  744.         }
  745.         else if (AMDisplayID)
  746.         {
  747.             if (!(Screen = OpenScreenTags(0,
  748.                 SA_Depth,2L,
  749.                 SA_DisplayID,AMDisplayID,
  750.                 SA_Overscan,OSCAN_TEXT,
  751.                 SA_Width,STDSCREENWIDTH,
  752.                 SA_Height,STDSCREENHEIGHT,
  753.                 SA_Pens,&pens,
  754.                 SA_PubName,PUBSCREENNAME,
  755.                 TAG_END)))
  756.                 SimpleRequest(Window,"Can't open Customscreen");
  757.             PubScreenStatus(Screen,0); /* make screen public */
  758.         }
  759.         else
  760.         {
  761.             if (!(PubScreen = LockPubScreen(0)))
  762.                 Panic(48,"can't lock default public screen!");
  763.         }
  764.     }
  765.  
  766.     if (Screen)
  767.     {
  768.         /* if we have our own screen, then set colors */
  769.         LoadRGB4(&(Screen->ViewPort),AMColors+1,(long)AMColors[0]);
  770.  
  771.         /* enable color changing */
  772.         for (nm=NewMenu;nm->nm_Type!=NM_END;++nm)
  773.             if (nm->nm_UserData == (APTR)CONF_COLORS)
  774.             {
  775.                 nm->nm_Flags &= ~NM_ITEMDISABLED;
  776.                 break;
  777.             }
  778.  
  779.         if ((vpmid = GetVPModeID(&Screen->ViewPort )) != INVALID_ID) 
  780.         {
  781.             GetDisplayInfoData(0, (UBYTE *)&di, sizeof(struct DimensionInfo), DTAG_DIMS, vpmid);
  782.             rect = &di.TxtOScan;
  783.             if (!WTop) WTop = Screen->BarHeight+2L;
  784.             if (!WWidth || WWidth>rect->MaxX) WWidth = rect->MaxX;
  785.             if (!WHeight || WHeight>rect->MaxY-(Screen->BarHeight+2L)) 
  786.                 WHeight = rect->MaxY-(Screen->BarHeight+2L);
  787.         }
  788.         else 
  789.             Panic(57,"Can't Get VPModeID!");
  790.     }
  791.     else
  792.     {
  793.  
  794.         /* disable color changing */
  795.         for (nm=NewMenu;nm->nm_Type!=NM_END;++nm)
  796.             if (nm->nm_UserData == (APTR)CONF_COLORS)
  797.             {
  798.                 nm->nm_Flags |= NM_ITEMDISABLED;
  799.                 break;
  800.             }
  801.  
  802.         if ((vpmid = GetVPModeID(&PubScreen->ViewPort )) != INVALID_ID) 
  803.         {
  804.             GetDisplayInfoData(0, (UBYTE *)&di, sizeof(struct DimensionInfo), DTAG_DIMS, vpmid);
  805.             rect = &di.TxtOScan;
  806.             if (!WTop) WTop = PubScreen->BarHeight+2L;
  807.             if (!WWidth || WWidth>rect->MaxX) WWidth = rect->MaxX;
  808.             if (!WHeight || WHeight>rect->MaxY-(PubScreen->BarHeight+2L)) 
  809.                 WHeight = rect->MaxY-(PubScreen->BarHeight+2L);
  810.         }
  811.         else 
  812.             Panic(58,"Can't Get VPModeID!");
  813.     }
  814.  
  815.     /* open window */
  816.     if (Screen) /* custom screen requested */
  817.     {
  818.         if (!(Window = OpenWindowTags(0,
  819.             /*WA_DetailPen,0x00,
  820.             WA_BlockPen,0x01,*/
  821.             WA_CustomScreen,Screen,
  822.             WA_Left,0L,
  823.             WA_Top,WTop,
  824.             WA_Width,WWidth,
  825.             WA_Height,WHeight,
  826.             WA_MinWidth,640L,
  827.             WA_MinHeight,180L,
  828.             WA_MaxWidth,1024L,
  829.             WA_MaxHeight,1024L,
  830.             WA_DragBar,TRUE,
  831.             WA_DepthGadget,TRUE,
  832.             WA_CloseGadget,TRUE,
  833.             WA_SizeGadget,TRUE,
  834.             WA_Activate,TRUE,
  835.             WA_SmartRefresh,TRUE,
  836.             WA_GimmeZeroZero,TRUE,
  837.             TAG_END)))
  838.             Panic(24,"Can't open Window!");
  839.  
  840.         /* get the screens's textattr */
  841.         TextAttr = *(Screen->Font);
  842.     }
  843.     else if (PubScreen) /* public screen requested */
  844.     {
  845.         if (!(Window = OpenWindowTags(0,
  846.             WA_PubScreen,(UBYTE *)PubScreen,
  847.             WA_Left,0L,
  848.             WA_Top,WTop,
  849.             WA_Width,WWidth,
  850.             WA_Height,WHeight,
  851.             WA_MinWidth,640L,
  852.             WA_MinHeight,180L,
  853.             WA_MaxWidth,1024L,
  854.             WA_MaxHeight,1024L,
  855.             WA_DragBar,TRUE,
  856.             WA_DepthGadget,TRUE,
  857.             WA_CloseGadget,TRUE,
  858.             WA_SizeGadget,TRUE,
  859.             WA_Activate,TRUE,
  860.             WA_SmartRefresh,TRUE,
  861.             WA_GimmeZeroZero,TRUE,
  862.             TAG_END)))
  863.             Panic(24,"Can't open Window!");
  864.         
  865.  
  866.         /* get the screens's textattr */
  867.         TextAttr = *(PubScreen->Font);
  868.     }
  869.  
  870.     /* set MyProcess->pr_WindowPtr to my window */
  871.     MyProcess = (struct Process *) FindTask(0L);
  872.     OldProcessWindow = MyProcess->pr_WindowPtr;
  873.     MyProcess->pr_WindowPtr = Window;
  874.     
  875.     Busy();
  876.  
  877.     /* open font */
  878.     if (*AMFont.ta_Name)
  879.     {
  880.         if (TextFont = OpenDiskFont(&AMFont))
  881.             TextAttr = AMFont;
  882.         else
  883.             if (TextFont = OpenFont(&AMFont))
  884.                 TextAttr = AMFont;
  885.             else 
  886.                 SimpleRequest(Window,"Can't open font, using screen's default font!");
  887.     }
  888.     else
  889.         if (!(TextFont = OpenDiskFont(&TextAttr)))
  890.             if (!(TextFont = OpenFont(&TextAttr)))
  891.                 SimpleRequest(Window,"Can't open screen's default font!");
  892.  
  893.     if (TextFont->tf_Flags & FPF_PROPORTIONAL)
  894.         SimpleRequest(Window,"Warning: Font is proportional");
  895.  
  896.     /* set window-/screeentitle */
  897.     sprintf(Windowtitle,
  898.         "AM %s - AmigaMail (C) 1991, 1992 by Christian Riede %s",
  899.         AMIGAMAIL_VERSION,(PubScreen)?("(V)"):(""));
  900.  
  901. redraw: /* entry when window must be redrawed (for example after resize ) */
  902.  
  903.     LastSelected = -1;
  904.  
  905.     /* adjust gadgets to window dimensions */
  906.     ListGadget.ng_TopEdge = 5+ListGadget.ng_TextAttr->ta_YSize;
  907.     ListGadget.ng_LeftEdge = 5;
  908.     ListGadget.ng_Width = Window->GZZWidth-10;
  909.     SelectGadget.ng_TopEdge = 
  910.         ShowGadget.ng_TopEdge = 
  911.         SortGadget.ng_TopEdge = 
  912.         Window->GZZHeight-6*(TextAttr.ta_YSize+1)-2;
  913.     ListGadget.ng_Height = SelectGadget.ng_TopEdge-5-5-ListGadget.ng_TextAttr->ta_YSize;
  914.     SelectGadget.ng_LeftEdge = 5;
  915.     ShowGadget.ng_LeftEdge = Window->GZZWidth/3;
  916.     SortGadget.ng_LeftEdge = (Window->GZZWidth*2)/3;
  917.  
  918.     /* Get Visual info */
  919.     if(!(ListGadget.ng_VisualInfo = GetVisualInfo(Window->WScreen,TAG_END)))
  920.         Panic(25,"Can't get Visual Info!");
  921.     SelectGadget.ng_VisualInfo = ListGadget.ng_VisualInfo;
  922.     ShowGadget.ng_VisualInfo = ListGadget.ng_VisualInfo;
  923.     SortGadget.ng_VisualInfo = ListGadget.ng_VisualInfo;
  924.     
  925.     /* create menues */
  926.     if (!(Menu = CreateMenus(NewMenu,TAG_END)))
  927.         Panic(42,"Can't create menu!");
  928.  
  929.     if (!LayoutMenus(Menu,ListGadget.ng_VisualInfo,TAG_END))
  930.         Panic(43,"Can't layout menu!");
  931.  
  932.     SetMenuStrip(Window,Menu);
  933.  
  934.     /* initial show/select */
  935.     (*Show)(&Mailbox);
  936.     (*Select)(&Mailbox,&Selected,Sort,0);
  937.  
  938.     /* create context */
  939.     if (!(gad = CreateContext(&GList)))
  940.     {
  941.         DeselectAll(&Selected);
  942.         Panic(26,"Can't create Gadget!");
  943.     }
  944.  
  945.     /* create select-gadget */
  946.     if(!(SelGad = gad = CreateGadget(MX_KIND,gad,&SelectGadget,
  947.         GTMX_Labels,SelectLabels,
  948.         GTMX_Spacing,1L,
  949.         TAG_END)))
  950.     {
  951.         DeselectAll(&Selected);
  952.         Panic(28,"Can't create Gadget!");
  953.     }
  954.  
  955.     /* create show-gadget */
  956.     if(!(gad = CreateGadget(MX_KIND,gad,&ShowGadget,
  957.         GTMX_Labels,ShowLabels,
  958.         GTMX_Spacing,1L,
  959.         TAG_END)))
  960.     {
  961.         DeselectAll(&Selected);
  962.         Panic(29,"Can't create Gadget!");
  963.     }
  964.  
  965.     /* create sort-gadget */
  966.     if(!(gad = CreateGadget(MX_KIND,gad,&SortGadget,
  967.         GTMX_Labels,SortLabels,
  968.         GTMX_Spacing,1L,
  969.         TAG_END)))
  970.     {
  971.         DeselectAll(&Selected);
  972.         Panic(30,"Can't create Gadget!");
  973.     }
  974.  
  975.     /* create listview gadget */
  976.     if (!(LVGadget = gad = CreateGadget(LISTVIEW_KIND,gad,&ListGadget,
  977.         GTLV_Labels,&Selected,
  978.         GTLV_ShowSelected,0L,
  979.         TAG_END)))
  980.     {
  981.         DeselectAll(&Selected);
  982.         Panic(27,"Can't create Gadget!");
  983.     }
  984.  
  985.     /* show up gadgets */
  986.     AddGList(Window,GList,-1,-1,NULL);
  987.     RefreshGList(GList,Window,NULL,-1);
  988.     GT_RefreshWindow(Window,0);
  989.     ActivateWindow(Window);
  990.  
  991.     /* turn on IDCMP */
  992.     Ready();
  993.  
  994.     /* main loop */
  995.     run = TRUE;
  996.     while (run)
  997.     {
  998.         /* wait for messages */
  999.         Signals = Wait(1L<<Window->UserPort->mp_SigBit | 1L<<NotifyPort->mp_SigBit);
  1000.  
  1001.         /* handle notification events */
  1002.         if (Signals & 1L<<NotifyPort->mp_SigBit) while (Msg = (struct AMMessage *)GetMsg(NotifyPort))
  1003.         {
  1004.             switch(Msg->Action)
  1005.             {
  1006.                 case NOTIFY_NEWITEM:
  1007.                     if (!GetNum(&Mailbox,Msg->Number))
  1008.                     {
  1009.                         DeselectAll(&Selected);
  1010.                         AddTail(&Mailbox,&(Msg->NewMail->m_Node));
  1011.                         RefreshDisplay(Select,Show,Sort,&Mailbox,
  1012.                             &Selected,LastSelected,(void *)SearchPattern);
  1013.                     }
  1014.                     break;                    
  1015.  
  1016.                 case NOTIFY_ITEM_DELETED:
  1017.                     DeselectAll(&Selected);
  1018.                     if (New = GetNum(&Mailbox,Msg->Number))
  1019.                     {
  1020.                         Remove(&(New->m_Node));
  1021.                         FreeMail(New);
  1022.                     }
  1023.                     RefreshDisplay(Select,Show,Sort,&Mailbox,
  1024.                         &Selected,LastSelected,(void *)SearchPattern);
  1025.                     break;                    
  1026.                 
  1027.                 case NOTIFY_ITEM_CHANGED:
  1028.                     RefreshDisplay(0,Show,0,&Mailbox,
  1029.                         &Selected,LastSelected,(void *)SearchPattern);
  1030.                     break;                    
  1031.             }
  1032.             FreeMem(Msg,sizeof(struct AMMessage));
  1033.         }
  1034.         
  1035.         /* handle Intuition events */
  1036.         if (Signals & 1L<<Window->UserPort->mp_SigBit) while (IMsg = GT_GetIMsg(Window->UserPort))
  1037.         {
  1038.             /* remember values */
  1039.             Class = IMsg->Class;
  1040.             Code  = IMsg->Code;    
  1041.             IAddr = IMsg->IAddress;
  1042.             Secs = IMsg->Seconds;
  1043.             Micros = IMsg->Micros;
  1044.  
  1045.             /* replay message */
  1046.             GT_ReplyIMsg(IMsg);
  1047.  
  1048.             /* dispatch */
  1049.             switch(Class)
  1050.             {
  1051.                 case REFRESHWINDOW:
  1052.                     GT_BeginRefresh(Window);
  1053.                     GT_EndRefresh(Window,TRUE);
  1054.                     break;
  1055.  
  1056.                 case CLOSEWINDOW:
  1057.                     if (running)
  1058.                         SimpleRequest(Window,"There are running subprocesses");
  1059.                     else
  1060.                         if (TwoGadRequest(Window,"Really Quit?"))
  1061.                             run = FALSE;
  1062.                     break;
  1063.  
  1064.                 case MENUPICK:
  1065.                     if (Code==MENUNULL) break;
  1066.                     if (!(MenuItem = ItemAddress(Menu,Code))) break;
  1067.                     switch((ULONG)GTMENUITEM_USERDATA(MenuItem))
  1068.                     {
  1069.                         case PROJ_QUIT:
  1070.                             if (running)
  1071.                                 SimpleRequest(Window,"There are running subprocesses");
  1072.                             else
  1073.                                 if (TwoGadRequest(Window,"Really Quit?"))
  1074.                                     run = FALSE;
  1075.                             break;
  1076.  
  1077.                         case PROJ_EXIT:
  1078.                             if (running)
  1079.                                 SimpleRequest(Window,"There are running subprocesses");
  1080.                             else
  1081.                                 if (TwoGadRequest(Window,"Really Exit?"))
  1082.                                     run = ExitFlag = FALSE;
  1083.                             break;
  1084.  
  1085.                         case PROJ_ABOUT:
  1086.                             Busy();
  1087.                             SimpleRequest(Window,"AM %s (AmigaMail)\n(C) 1991, 1992 by Christian Riede\nUse and distribute under the terms of\nthe GNU General Public License Version 1",
  1088.                                 AMIGAMAIL_VERSION);
  1089.                             Ready();
  1090.                             break;
  1091.  
  1092.                         case AC_READ:
  1093.                             ActionRead(LastSelected,&Selected);
  1094.                             break;
  1095.  
  1096.                         case AC_SAVE:
  1097.                             ActionSave(LastSelected,&Selected);
  1098.                             break;
  1099.  
  1100.                         case AC_SEND:
  1101.                             Busy();
  1102.                             sprintf(SendParms,"%ld %lx %s",
  1103.                                 SFLAGS_SEND,
  1104.                                 0,
  1105.                                 "laber");
  1106.                             CreateNewProcTags(
  1107.                                 NP_Entry,SendMail,
  1108.                                 NP_StackSize,32768,
  1109.                                 NP_Arguments,SendParms,
  1110.                                 NP_Name,"AM_SendMail",
  1111.                                 TAG_END,0);
  1112.                             Ready();
  1113.                             break;
  1114.  
  1115.                         case AC_SENDILBM:
  1116.                             Busy();
  1117.                             /* get filename */
  1118.                             if (AslRequestTags(FReq,
  1119.                                 ASL_Window,Window,
  1120.                                 TAG_END,0)) 
  1121.                             {
  1122.                                 strcpy((char *)IFFName,(char *)FReq->rf_Dir);
  1123.                                 AddPart((UBYTE *)IFFName,(UBYTE *)FReq->rf_File,160);
  1124.                                 sprintf(SendParms,"%ld %lx %s",
  1125.                                     SFLAGS_SEND|SFLAGS_ILBM,
  1126.                                     0,
  1127.                                     IFFName);
  1128.                                 /*  send file */
  1129.                                 CreateNewProcTags(
  1130.                                     NP_Entry,SendMail,
  1131.                                     NP_StackSize,32768,
  1132.                                     NP_Arguments,SendParms,
  1133.                                     NP_Name,"AM_SendMail (ILBM)",
  1134.                                     TAG_END,0);
  1135.                             }
  1136.                             Ready();
  1137.                             break;
  1138.  
  1139.                         case AC_SENDGIF:
  1140.                             Busy();
  1141.                             /* get filename */
  1142.                             if (AslRequestTags(FReq,
  1143.                                 ASL_Window,Window,
  1144.                                 TAG_END,0)) 
  1145.                             {
  1146.                                 strcpy((char *)IFFName,(char *)FReq->rf_Dir);
  1147.                                 AddPart((UBYTE *)IFFName,(UBYTE *)FReq->rf_File,160);
  1148.                                 sprintf(SendParms,"%ld %lx %s",
  1149.                                     SFLAGS_SEND|SFLAGS_GIF,
  1150.                                     0,
  1151.                                     IFFName);
  1152.                                 /*  send file */
  1153.                                 CreateNewProcTags(
  1154.                                     NP_Entry,SendMail,
  1155.                                     NP_StackSize,32768,
  1156.                                     NP_Arguments,SendParms,
  1157.                                     NP_Name,"AM_SendMail (ILBM)",
  1158.                                     TAG_END,0);
  1159.                             }
  1160.                             Ready();
  1161.                             break;
  1162.  
  1163.                         case AC_REPLY:
  1164.                             Busy();
  1165.                             ActionReply(LastSelected,&Selected,0);
  1166.                             Ready();
  1167.                             break;
  1168.  
  1169.                         case AC_REPLY_QUOTE:
  1170.                             Busy();
  1171.                             ActionReply(LastSelected,&Selected,SFLAGS_QUOTE);
  1172.                             Ready();
  1173.                             break;
  1174.  
  1175.                         case AC_REPLY_QUOTE_H:
  1176.                             Busy();
  1177.                             ActionReply(LastSelected,&Selected,SFLAGS_QUOTE|SFLAGS_HEADER);
  1178.                             Ready();
  1179.                             break;
  1180.  
  1181.                         case AC_FORWARD:
  1182.                             Busy();
  1183.                             ActionForward(LastSelected,&Selected,0);
  1184.                             Ready();
  1185.                             break;
  1186.  
  1187.                         case AC_FORWARD_H:
  1188.                             Busy();
  1189.                             ActionForward(LastSelected,&Selected,SFLAGS_HEADER);
  1190.                             Ready();
  1191.                             break;
  1192.  
  1193.                         case AC_MARK_READ:
  1194.                             if (LastSelected>=0)
  1195.                             {
  1196.                                 if (Mail = GetMail(LastSelected,&Selected))
  1197.                                 {
  1198.                                     Mail->read |= MAIL_READ;
  1199.                                     MarkRead(Mail->Number);
  1200. /* refresh will be done on notification RefreshDisplay(0,Show,0,&Mailbox,
  1201.                                         &Selected,LastSelected,(void *)SearchPattern);
  1202. */                                }
  1203.                             }
  1204.                             else
  1205.                                 SimpleRequest(Window,"No item selected");
  1206.                             break;
  1207.  
  1208.                         case AC_MARK_UNREAD:
  1209.                             if (LastSelected>=0)
  1210.                             {
  1211.                                 if (Mail = GetMail(LastSelected,&Selected))
  1212.                                 {
  1213.                                     Mail->read &= ~MAIL_READ;
  1214.                                     MarkUnread(Mail->Number);
  1215. /* refresh will be done on notification RefreshDisplay(0,Show,0,&Mailbox,
  1216.                                         &Selected,LastSelected,(void *)SearchPattern);
  1217. */                                }
  1218.                             }
  1219.                             else
  1220.                                 SimpleRequest(Window,"No item selected");
  1221.                             break;
  1222.  
  1223.                         case AC_PRINT:
  1224.                             Busy();
  1225.                             ActionPrint(LastSelected,&Selected);
  1226.                             Ready();
  1227.                             break;
  1228.  
  1229.                         case AC_SEARCH_TEXT:
  1230.                             Busy();
  1231.                             if (SearchHeader = RequestSearchString(SearchPattern))
  1232.                             {
  1233.                                 Select = (SearchHeader-1)?
  1234.                                     (SelectSearchText):(SelectSearchTextH);
  1235.                                 RefreshDisplay(Select,0,Sort,&Mailbox,
  1236.                                     &Selected,-1,(void *)SearchPattern);
  1237.                                 GT_SetGadgetAttrs(SelGad,Window,0,
  1238.                                     GTMX_Active,5L,
  1239.                                     TAG_END,0);
  1240.                             }
  1241.                             else
  1242.                                 SearchPattern[0]=0;
  1243.  
  1244.                             Ready();
  1245.                             break;
  1246.                             
  1247.                         case AC_DELETE:
  1248.                             Busy();
  1249.                             ActionDelete(LastSelected,&Selected);
  1250.                             Ready();
  1251.                             break;
  1252.  
  1253.                         case ADDR_EDIT:
  1254.                             Busy();
  1255.                             EditAddressBook();
  1256.                             Ready();
  1257.                             break;
  1258.  
  1259.                         case ADDR_PRINT:
  1260.                             Busy();
  1261.                             SimpleRequest(Window,"not yet implemented");
  1262.                             Ready();
  1263.                             break;
  1264.  
  1265.                         case ADDR_ADDCURR:
  1266.                             Busy();
  1267.                             ActionAddAddress(LastSelected,&Selected);
  1268.                             Ready();
  1269.                             break;
  1270.  
  1271.                         case CONF_FONT:
  1272.                             Busy();
  1273.  
  1274.                             if (AslRequestTags(FontReq,
  1275.                                 ASL_Window,Window,
  1276.                                 ASL_Hail,(ULONG)"AM Font",
  1277.                                 ASL_MaxHeight,30,
  1278.                                 ASL_FuncFlags,FONF_STYLES,
  1279. /*                                ASL_ModeList,(ULONG)&ModeList,
  1280. */                                ASL_FontName,AMFont.ta_Name,
  1281.                                 ASL_FontHeight,AMFont.ta_YSize,
  1282.                                 ASL_FontFlags,AMFont.ta_Flags,
  1283.                                 ASL_FontStyles,AMFont.ta_Style,
  1284.                                 TAG_END,0)) 
  1285.                             {
  1286.                                 DeselectAll(&Selected);
  1287.                                 Panic(-1,0);
  1288.                                 strcpy((char *)AMFont.ta_Name,(char *)FontReq->fo_Attr.ta_Name);
  1289.                                 AMFont.ta_YSize = FontReq->fo_Attr.ta_YSize;
  1290.                                 AMFont.ta_Style = FontReq->fo_Attr.ta_Style;
  1291.                                 AMFont.ta_Flags = FontReq->fo_Attr.ta_Flags;
  1292.                                 if (TextFont = OpenDiskFont(&AMFont))
  1293.                                     TextAttr = AMFont;
  1294.                                 else
  1295.                                     if (TextFont = OpenFont(&AMFont))
  1296.                                         TextAttr = AMFont;
  1297.                                     else 
  1298.                                     {
  1299.                                         SimpleRequest(Window,"Can't open font, using screen's default font!");
  1300.                                         TextAttr = *(Screen->Font);
  1301.                                         if (!(TextFont = OpenDiskFont(&TextAttr)))
  1302.                                             if (!(TextFont = OpenFont(&TextAttr)))
  1303.                                                 SimpleRequest(Window,"Can't open screen's default font!");
  1304.                                     }
  1305.                                 goto restart;
  1306.                             }
  1307.  
  1308.                             Ready();
  1309.                             break;
  1310.  
  1311.                         case CONF_COLORS:
  1312.                             Busy();
  1313.                             if (AMDisplayID)
  1314.                             {
  1315.                                 if (Screen)
  1316.                                     colorreq(PUBSCREENNAME,"Change Colors",(unsigned short)0x00);
  1317.                                 else if (*AMPubScreen)
  1318.                                     colorreq(AMPubScreen,"Change Colors",(unsigned short)0x00);
  1319.                                 else 
  1320.                                     colorreq(0,"Change Colors",(unsigned short)0x00);
  1321.                                 /*System((UBYTE *)"sys:tools/colors",AMSystemTags);*/
  1322.                             }
  1323.                             Ready();
  1324.                             break;
  1325.  
  1326.                         case CONF_RRT:
  1327.                             ClearMenuStrip(Window);
  1328.                             /* was selected? then deselect! */
  1329.                             if (AMReturnReceiptTo[0]=='y' || AMReturnReceiptTo[0]=='Y')
  1330.                                 MenuItem->Flags&=~CHECKED;
  1331.                             strcpy(AMReturnReceiptTo,
  1332.                                 (MenuItem->Flags&CHECKED)?
  1333.                                 ("Yes"):("No"));
  1334.                             SetMenuStrip(Window,Menu);
  1335.                             break;
  1336.  
  1337.                         case CONF_SCREEN:
  1338.                             /* not handled here */
  1339.                             break;
  1340.  
  1341.                         case CONF_MEDITOR:
  1342.                             Busy();
  1343.                             strcpy((char *)FReq->rf_File,(char *)FilePart((UBYTE *)MailEditor));
  1344.                             strncpy((char *)FReq->rf_Dir,
  1345.                                 MailEditor,
  1346.                                 (char *)PathPart((UBYTE *)MailEditor)-MailEditor);
  1347.                             FReq->rf_Dir[(char *)PathPart((UBYTE *)MailEditor)-MailEditor]=0;
  1348.                             if (AslRequestTags(FReq,
  1349.                                 ASL_Window,Window,
  1350.                                 TAG_END,0)) 
  1351.                             {
  1352.                                 strcpy(MailEditor,(char *)FReq->rf_Dir);
  1353.                                 AddPart((UBYTE *)MailEditor,(UBYTE *)FReq->rf_File,160);
  1354.                             }
  1355.                             Ready();
  1356.                             break;
  1357.  
  1358.                         case CONF_RFILTER:
  1359.                             Busy();
  1360.                             strcpy((char *)FReq->rf_File,(char *)FilePart((UBYTE *)RFilter));
  1361.                             strncpy(
  1362.                                 (char *)FReq->rf_Dir,
  1363.                                 RFilter,
  1364.                                 (char *)PathPart((UBYTE *)RFilter)-RFilter);
  1365.                             FReq->rf_Dir[(char *)PathPart((UBYTE *)RFilter)-RFilter]=0;
  1366.                             if (AslRequestTags(FReq,
  1367.                                 ASL_Window,Window,
  1368.                                 TAG_END,0)) 
  1369.                             {
  1370.                                 strcpy(RFilter,(char *)FReq->rf_Dir);
  1371.                                 AddPart((UBYTE *)RFilter,(UBYTE *)FReq->rf_File,160);
  1372.                             }
  1373.                             Ready();
  1374.                             break;
  1375.  
  1376.                         case CONF_SIGNATURE:
  1377.                             Busy();
  1378.                             strcpy((char *)FReq->rf_File,(char *)FilePart((UBYTE *)Signature));
  1379.                             strncpy((char *)FReq->rf_Dir,Signature,(char *)PathPart((UBYTE *)Signature)-Signature);
  1380.                             FReq->rf_Dir[(char *)PathPart((UBYTE *)Signature)-Signature]=0;
  1381.                             if (AslRequestTags(FReq,
  1382.                                 ASL_Window,Window,
  1383.                                 TAG_END,0)) 
  1384.                             {
  1385.                                 strcpy(Signature,(char *)FReq->rf_Dir);
  1386.                                 AddPart((UBYTE *)Signature,(UBYTE *)FReq->rf_File,160);
  1387.                             }
  1388.                             Ready();
  1389.                             break;
  1390.  
  1391.                         case CONF_SAVE:
  1392.                             Busy();
  1393.                             if (Screen)
  1394.                             {
  1395.                                 AMColors[0]=4;
  1396.                                 AMColors[1]=GetRGB4(Screen->ViewPort.ColorMap,0L);
  1397.                                 AMColors[2]=GetRGB4(Screen->ViewPort.ColorMap,1L);
  1398.                                 AMColors[3]=GetRGB4(Screen->ViewPort.ColorMap,2L);
  1399.                                 AMColors[4]=GetRGB4(Screen->ViewPort.ColorMap,3L);
  1400.                             }
  1401.                             strcpy((char *)FReq->rf_File,(char *)FilePart((UBYTE *)Config));
  1402.                             strncpy((char *)FReq->rf_Dir,Config,(char *)PathPart((UBYTE *)Config)-Config);
  1403.                             FReq->rf_Dir[(char *)PathPart((UBYTE *)Config)-Config]=0;
  1404.                             if (AslRequestTags(FReq,
  1405.                                 ASL_Window,Window,
  1406.                                 TAG_END,0)) 
  1407.                             {
  1408.                                 strcpy(Config,(char *)FReq->rf_Dir);
  1409.                                 AddPart((UBYTE *)Config,(UBYTE *)FReq->rf_File,160);
  1410.                                 WriteConfig(Config);
  1411.                             }
  1412.                             Ready();
  1413.                             break;
  1414.  
  1415.                         case CONF_LOAD:
  1416.                             Busy();
  1417.                             strcpy((char *)FReq->rf_File,(char *)FilePart((UBYTE *)Config));
  1418.                             strncpy((char *)FReq->rf_Dir,Config,(char *)PathPart((UBYTE *)Config)-Config);
  1419.                             strncpy((char *)FReq->rf_Dir,Config,(char *)PathPart((UBYTE *)Config)-Config);
  1420.                             if (AslRequestTags(FReq,
  1421.                                 ASL_Window,Window,
  1422.                                 TAG_END,0)) 
  1423.                             {
  1424.                                 Panic(-1,0);
  1425.                                 strcpy(Config,(char *)FReq->rf_Dir);
  1426.                                 AddPart((UBYTE *)Config,(UBYTE *)FReq->rf_File,160);
  1427.                                 ReadConfig(Config);
  1428.                                 goto restart;
  1429.                             }
  1430.                             Ready();
  1431.                             break;
  1432.  
  1433.                         case CONF_REPLY_TO:
  1434.                             Busy();
  1435.                             RequestString("Reply-To Address",ReplyTo,MAIL_FIELDLENGTH);
  1436.                             Ready();
  1437.                             break;
  1438.  
  1439.                         case SCR_PUBSCR:
  1440.                             Busy();    
  1441.                             if (RequestString(
  1442.                                 "Public Screen Name (none for default Public Screen):",
  1443.                                 AMPubScreen,MAIL_FIELDLENGTH))
  1444.                             {
  1445.                                 AMDisplayID = 0;
  1446.                                 DeselectAll(&Selected);
  1447.                                 Panic(-1,0);
  1448.                                 goto restart;
  1449.                             }
  1450.                             Ready();
  1451.                             break;
  1452.  
  1453.                         case PAL_MONITOR_ID|HIRES_KEY:
  1454.                         case PAL_MONITOR_ID|HIRESLACE_KEY:
  1455.                         case NTSC_MONITOR_ID|HIRES_KEY:
  1456.                         case NTSC_MONITOR_ID|HIRESLACE_KEY:
  1457.                         case VGAPRODUCT_KEY:
  1458.                         case VGAPRODUCTLACE_KEY:
  1459.                             *AMPubScreen=0;
  1460.                             AMDisplayID = (ULONG)GTMENUITEM_USERDATA(MenuItem);
  1461.                             DeselectAll(&Selected);
  1462.                             Panic(-1,0);
  1463.                             goto restart;
  1464.                             break;
  1465.  
  1466.                         default:
  1467.                             break;
  1468.                     }
  1469.                     break;
  1470.                 case GADGETUP:
  1471.                     switch(((struct Gadget *)IAddr)->GadgetID)
  1472.                     {
  1473.                         case LIST: /* user selected item */
  1474.                             if (DoubleClick(LastSecs,LastMicros,Secs,Micros) &&
  1475.                                 (Secs!=LastSecs || Micros-LastMicros>300)) 
  1476.                                     /* against chattering mousebuttons */
  1477.                             {
  1478.                                 ActionRead(Code,&Selected);
  1479. /* refresh will be done on notification RefreshDisplay(0,Show,0,&Mailbox,
  1480.                                     &Selected,LastSelected,(void *)SearchPattern);
  1481. */                            }
  1482.                             LastSelected = Code;
  1483.                             LastSecs = Secs;
  1484.                             LastMicros = Micros;
  1485.                             break;
  1486.                         default:
  1487.                             puts("unknown gadget released");
  1488.                     }
  1489.                     break;
  1490.  
  1491.                 case GADGETDOWN:
  1492.                     switch(((struct Gadget *)IAddr)->GadgetID)
  1493.                     {
  1494.                         case SELECT:
  1495.                             switch(Code)
  1496.                             {
  1497.                                 case 0: Select = SelectNew; break; 
  1498.                                 case 1: Select = SelectAll; break; 
  1499.                                 case 2: Select = SelectLastWeek; break; 
  1500.                                 case 3: Select = SelectFromMe; break; 
  1501.                                 case 4: Select = SelectToMe; break; 
  1502.                                 case 5: 
  1503.                                     if (SearchHeader = RequestSearchString(SearchPattern))
  1504.                                     {
  1505.                                         Select = (SearchHeader-1)?
  1506.                                             (SelectSearchText):(SelectSearchTextH);
  1507.                                     }
  1508.                                     else
  1509.                                     {
  1510.                                         Select = SelectSearchTextH;
  1511.                                         SearchPattern[0]=0;
  1512.                                     }
  1513.                                 break;
  1514.                                 default: 
  1515.                                     puts("unknown item in select-gadget");
  1516.                             }
  1517.                             RefreshDisplay(Select,0,Sort,&Mailbox,
  1518.                                 &Selected,LastSelected,(void *)SearchPattern);
  1519.                             break;
  1520.  
  1521.                         case SHOW:
  1522.                             switch (Code)
  1523.                             {
  1524.                                 case 0: Show = ShowAll; break;
  1525.                                 case 1: Show = ShowFrom; break;
  1526.                                 case 2: Show = ShowTo; break;
  1527.                                 case 3: Show = ShowSubject; break;
  1528.                                 case 4: Show = ShowDate; break;
  1529.                                 case 5: Show = ShowMsgId; break;
  1530.                                 default: puts("unknown item in show-gadget");
  1531.                             }
  1532.                             RefreshDisplay(0,Show,0,&Mailbox,
  1533.                                 &Selected,LastSelected,(void *)SearchPattern);
  1534.                             break;
  1535.  
  1536.                         case SORT:
  1537.                             switch (Code)
  1538.                             {
  1539.                                 case 0: Sort = InsertByNumber; break;
  1540.                                 case 1: Sort = InsertByFrom; break;
  1541.                                 case 2: Sort = InsertByTo; break;
  1542.                                 case 3: Sort = InsertBySubject; break;
  1543.                                 case 4: Sort = InsertByDate; break;
  1544.                                 case 5: Sort = InsertByInReplyTo; break;
  1545.                                 default: puts("unknown item in sort-gadget");
  1546.                             }
  1547.                             RefreshDisplay(Select,0,Sort,&Mailbox,
  1548.                                 &Selected,-1,(void *)SearchPattern);
  1549.                             break;
  1550.                         default:
  1551.                             puts("unknown gadget pressed");
  1552.                     }
  1553.                     break;
  1554.  
  1555.                 case MOUSEBUTTONS:
  1556.                     break;
  1557.  
  1558.                 case INTUITICKS:
  1559.                     break;
  1560.  
  1561.                 case SIZEVERIFY:
  1562.                     break;
  1563.  
  1564.                 case NEWSIZE:
  1565.                     DeselectAll(&Selected);
  1566.                     WLeft = Window->LeftEdge;
  1567.                     WTop = Window->TopEdge;
  1568.                     WWidth = Window->Width;
  1569.                     WHeight = Window->Height;
  1570.                     /* remove,free gadgets */
  1571.                     RemoveGList(Window,GList,-1); 
  1572.                     FreeGadgets(GList); 
  1573.                     GList = 0;
  1574.                     /* remove menus */
  1575.                     ClearMenuStrip(Window); 
  1576.                     FreeMenus(Menu); 
  1577.                     Menu=0;
  1578.                     /* clear Window */
  1579.                     SetRast(Window->RPort,0L);
  1580.                     goto redraw;
  1581.                     break;
  1582.  
  1583.                 case VANILLAKEY:
  1584.                     switch(Code)
  1585.                     {
  1586.                         case ' ': /* space */
  1587.                         case 13: /* return */
  1588.                             if (LastSelected==-1) LastSelected = 0;
  1589.                             ActionRead(LastSelected,&Selected);
  1590.                             if (Code == ' ') 
  1591.                             {
  1592.                                 LastSelected++;
  1593.                                 RefreshDisplay(0,0,0,&Mailbox,
  1594.                                     &Selected,LastSelected,(void *)SearchPattern);
  1595.                             }
  1596.                             break;
  1597.  
  1598.                         case 'r':
  1599.                             Busy();
  1600.                             ActionReply(LastSelected,&Selected,0);
  1601.                             Ready();
  1602.                             break;
  1603.  
  1604.                         case 'R':
  1605.                             Busy();
  1606.                             ActionReply(LastSelected,&Selected,SFLAGS_QUOTE);
  1607.                             Ready();
  1608.                             break;
  1609.  
  1610.                         case 'f':
  1611.                             Busy();
  1612.                             ActionForward(LastSelected,&Selected,0);
  1613.                             Ready();
  1614.                             break;
  1615.  
  1616.                         case 'F':
  1617.                             Busy();
  1618.                             ActionForward(LastSelected,&Selected,SFLAGS_HEADER);
  1619.                             Ready();
  1620.                             break;
  1621.  
  1622.                         case 'd':
  1623.                         /*case 'D':*/
  1624.                             Busy();
  1625.                             ActionDelete(LastSelected,&Selected);
  1626.                             Ready();
  1627.                             break;
  1628.  
  1629.                         case 's':
  1630.                         /*case 'S':*/
  1631.                             Busy();
  1632.                             sprintf(SendParms,"%ld %lx %s",
  1633.                                 SFLAGS_SEND,
  1634.                                 0,
  1635.                                 "laber");
  1636.                             CreateNewProcTags(
  1637.                                 NP_Entry,SendMail,
  1638.                                 NP_StackSize,32768,
  1639.                                 NP_Arguments,SendParms,
  1640.                                 NP_Name,"AM_SendMail",
  1641.                                 TAG_END,0);
  1642.                             Ready();
  1643.                             break;
  1644.  
  1645.                         case 'p':
  1646.                         /*case 'P':*/
  1647.                             Busy();
  1648.                             ActionPrint(LastSelected,&Selected);
  1649.                             Ready();
  1650.                             break;
  1651.  
  1652.  
  1653.                             
  1654.                     }
  1655.                     break;
  1656.  
  1657.                 case RAWKEY:
  1658. /*                    printf("%d\n",(int)Code);*/
  1659.                     switch(Code)
  1660.                     {
  1661.                         case 76: /* cursor up */
  1662.                             if (LastSelected>0)
  1663.                             {
  1664.                                 LastSelected--;
  1665.                                 RefreshDisplay(0,0,0,&Mailbox,
  1666.                                     &Selected,LastSelected,(void *)SearchPattern);
  1667.                             }
  1668.                             break;
  1669.  
  1670.                         case 77: /* cursor down */
  1671.                             LastSelected++;
  1672.                             RefreshDisplay(0,0,0,&Mailbox,
  1673.                                 &Selected,LastSelected,(void *)SearchPattern);
  1674.                             break;
  1675.                     }
  1676.                     break;
  1677.  
  1678.                 
  1679.                 default:
  1680.                     printf("Unknkown IntuiMessage->Class:%x\n",Class);
  1681.                     break;
  1682.             }
  1683.         }
  1684.  
  1685.         /* if run == FALSE, check if there are visitor windows on our public screen */
  1686.         if (!run)
  1687.             if (Screen)
  1688.                 if (!(PubScreenStatus(Screen,PSNF_PRIVATE)&1))
  1689.                 {
  1690.                     run = TRUE;
  1691.                     SimpleRequest(Window,"Cant close public screen:\n close all visitor windows first");
  1692.                 }
  1693.     }
  1694.  
  1695.     Busy();
  1696.  
  1697.     DeselectAll(&Selected);
  1698.  
  1699.     if (ExitFlag) /* mark mail as old */
  1700.         for (Mail=(struct Mail *)Mailbox.lh_Head;
  1701.             Mail->m_Node.ln_Succ;
  1702.             Mail=(struct Mail *)Mail->m_Node.ln_Succ)
  1703.             if (Mail->read & MAIL_NEW)
  1704.                 MarkOld(Mail->Number);
  1705.  
  1706.     FreeMailbox(&Mailbox);
  1707.  
  1708.     /* everything OK */
  1709.     Panic(0,"");
  1710. }
  1711.